{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NameError or IndexError is happened! \n"
     ]
    },
    {
     "ename": "NameError",
     "evalue": "name 'e' is not defined",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[2], line 3\u001b[0m\n\u001b[0;32m      2\u001b[0m list_data \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m----> 3\u001b[0m result \u001b[38;5;241m=\u001b[39m \u001b[43mvar\u001b[49m \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m10\u001b[39m\n\u001b[0;32m      4\u001b[0m result \u001b[38;5;241m=\u001b[39m list_data[\u001b[38;5;241m2\u001b[39m] \u001b[38;5;241m*\u001b[39m \u001b[38;5;241m10\u001b[39m\n",
      "\u001b[1;31mNameError\u001b[0m: name 'var' is not defined",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mNameError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[2], line 7\u001b[0m\n\u001b[0;32m      5\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m (\u001b[38;5;167;01mNameError\u001b[39;00m,\u001b[38;5;167;01mIndexError\u001b[39;00m):\n\u001b[0;32m      6\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mNameError or IndexError is happened! \u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[1;32m----> 7\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[43me\u001b[49m\u001b[38;5;241m.\u001b[39margs)\n\u001b[0;32m      8\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m:\n\u001b[0;32m      9\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOther except is happened!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n",
      "\u001b[1;31mNameError\u001b[0m: name 'e' is not defined"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    list_data = []\n",
    "    result = var * 10\n",
    "    result = list_data[2] * 10\n",
    "except (NameError,IndexError):\n",
    "    print('NameError or IndexError is happened! ')\n",
    "    print(e.args)\n",
    "except Exception:\n",
    "    print('Other except is happened!')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "unsupported operand type(s) for +: 'int' and 'str'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[3], line 11\u001b[0m\n\u001b[0;32m      9\u001b[0m     \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mOther except is happened\u001b[39m\u001b[38;5;124m'\u001b[39m)\n\u001b[0;32m     10\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m---> 11\u001b[0m     result \u001b[38;5;241m=\u001b[39m \u001b[38;5;241;43m1\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43mquant\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\n",
      "\u001b[1;31mTypeError\u001b[0m: unsupported operand type(s) for +: 'int' and 'str'"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    var = 1; list_data = [0,1,2]\n",
    "    result = var * 10\n",
    "    result = list_data[2] * 10\n",
    "except (NameError,IndexError) as e:\n",
    "    print('NameError or IndexError is happened! ')\n",
    "    print(e.args)\n",
    "except Exception as e:\n",
    "    print('Other except is happened')\n",
    "else:\n",
    "    result = 1 + 'quant'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "finally file close! \n"
     ]
    }
   ],
   "source": [
    "try:\n",
    "    f = open('Code_for_Python.py', 'w')\n",
    "    result = var * 10\n",
    "    result = list_data[2] * 10\n",
    "except (NameError,IndexError) as e:\n",
    "    print('NameError or IndexError is happened! ')\n",
    "    print(e.args)\n",
    "except Exception as e:\n",
    "    print('Other except is happened!')\n",
    "finally:\n",
    "    print('finally file close! ')\n",
    "    f.close\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.2.4\n",
      "[1. 2. 3. 4. 5. 6.]\n",
      "1\n",
      "(6,)\n",
      "float64\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "print(np.__version__)\n",
    "#ndarray\n",
    "array_1x6 = np.array([1.0,2.0,3.0,4.0,5.0,6.0],dtype=np.float64)\n",
    "print(array_1x6)\n",
    "print(array_1x6.ndim)\n",
    "print(array_1x6.shape)\n",
    "print(array_1x6.dtype)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[[ 1.   2.   3.   4.   5.   6. ]\n",
      "  [ 1.1  2.1  3.1  4.1  5.1  6.1]\n",
      "  [ 1.2  2.2  3.2  4.2  5.2  6.2]]\n",
      "\n",
      " [[ 7.   8.   9.  10.  11.  12. ]\n",
      "  [ 7.1  8.1  9.1 10.1 11.1 12.1]\n",
      "  [ 7.2  8.2  9.2 10.2 11.2 12.2]]]\n",
      "3\n",
      "(2, 3, 6)\n",
      "float64\n"
     ]
    }
   ],
   "source": [
    "#三维ndarray\n",
    "array_2x3x6 = np.array([[[1.0,2.0,3.0,4.0,5.0,6.0],[1.1,2.1,3.1,4.1,5.1,6.1],[1.2,2.2,3.2,4.2,5.2,6.2]],\n",
    "                     [[7.0,8.0,9.0,10.0,11.0,12.0],[7.1,8.1,9.1,10.1,11.1,12.1],[7.2,8.2,9.2,10.2,11.2,12.2]]])\n",
    "print(array_2x3x6)\n",
    "print(array_2x3x6.ndim)\n",
    "print(array_2x3x6.shape)\n",
    "print(array_2x3x6.dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.  2.  3.  4.  5.  6. ]\n",
      " [1.1 2.1 3.1 4.1 5.1 6.1]]\n",
      "2\n",
      "(2, 6)\n",
      "float64\n"
     ]
    }
   ],
   "source": [
    "#二维ndarray\n",
    "array_2x6 = np.array([[1.0,2.0,3.0,4.0,5.0,6.0],[1.1,2.1,3.1,4.1,5.1,6.1]])\n",
    "print(array_2x6)\n",
    "print(array_2x6.ndim)\n",
    "print(array_2x6.shape)\n",
    "print(array_2x6.dtype)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[6, 6, 6], [7, 7, 7], [8, 8, 8], [9, 9, 9]]\n"
     ]
    }
   ],
   "source": [
    "list_4x3_a = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]]\n",
    "list_4x3_b = [[5,5,5],[5,5,5],[5,5,5],[5,5,5]]\n",
    "list_4x3_c = [[0,0,0],[0,0,0],[0,0,0],[0,0,0]]\n",
    "for i in range(4):\n",
    "    for j in range(3):\n",
    "        list_4x3_c[i][j] = list_4x3_a[i][j] +list_4x3_b[i][j]\n",
    "print(list_4x3_c) "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[6 6 6]\n",
      " [7 7 7]\n",
      " [8 8 8]\n",
      " [9 9 9]]\n",
      "------------------\n",
      "[[6 6 6]\n",
      " [7 7 7]\n",
      " [8 8 8]\n",
      " [9 9 9]]\n"
     ]
    }
   ],
   "source": [
    "#Numpy矢量化运算--表达式\n",
    "array_4x3_a = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])\n",
    "array_4x3_b = np.array([[5,5,5],[5,5,5],[5,5,5],[5,5,5]])\n",
    "print(array_4x3_a + array_4x3_b)\n",
    "print(\"------------------\")\n",
    "#Numpy广播特性--标量\n",
    "print(array_4x3_a+5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[2 3 4]\n",
      " [3 4 5]\n",
      " [4 5 6]\n",
      " [5 6 7]]\n"
     ]
    }
   ],
   "source": [
    "#Numpy广播特性--兼容规则\n",
    "array_4x3 = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])\n",
    "array_1x3 = np.array([1,2,3])\n",
    "print(array_4x3 + array_1x3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1]\n",
      " [1]]\n",
      "[[2 2 2]\n",
      " [3 3 3]\n",
      " [4 4 4]\n",
      " [5 5 5]]\n"
     ]
    },
    {
     "ename": "ValueError",
     "evalue": "operands could not be broadcast together with shapes (4,3) (2,1) ",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mValueError\u001b[0m                                Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[20], line 6\u001b[0m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;28mprint\u001b[39m(array_2x1)\n\u001b[0;32m      5\u001b[0m \u001b[38;5;28mprint\u001b[39m(array_4x3 \u001b[38;5;241m+\u001b[39m array_4x1)\n\u001b[1;32m----> 6\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[43marray_4x3\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43marray_2x1\u001b[49m)\n",
      "\u001b[1;31mValueError\u001b[0m: operands could not be broadcast together with shapes (4,3) (2,1) "
     ]
    }
   ],
   "source": [
    "array_4x3 = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])\n",
    "array_2x1 = np.array([[1],[1]])\n",
    "array_4x1 = np.array([[1],[1],[1],[1]])\n",
    "print(array_2x1)\n",
    "print(array_4x3 + array_4x1)\n",
    "print(array_4x3 + array_2x1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1.1 1.2 1.3]\n",
      " [2.1 2.2 2.3]\n",
      " [3.1 3.2 3.3]\n",
      " [4.1 4.2 4.3]]\n",
      "[[1.1 1.2 1.3]]\n",
      "[1.2]\n",
      "[[ True  True  True]\n",
      " [False False False]\n",
      " [False False False]\n",
      " [False False False]]\n",
      "[1.1 1.2 1.3]\n"
     ]
    }
   ],
   "source": [
    "array_4x3 = np.array([[1.1,1.2,1.3],[2.1,2.2,2.3],[3.1,3.2,3.3],[4.1,4.2,4.3]])\n",
    "print(array_4x3)\n",
    "#用条件表达式选取元素\n",
    "print(array_4x3[[True, False, False, False]])\n",
    "# 1表示第1列\n",
    "print(array_4x3[[True, False, False, False], 1])\n",
    "print(array_4x3 <2)\n",
    "print(array_4x3[array_4x3 <2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1. 0. 0. 0. 0. 0.]\n",
      " [0. 1. 0. 0. 0. 0.]\n",
      " [0. 0. 1. 0. 0. 0.]\n",
      " [0. 0. 0. 1. 0. 0.]]\n"
     ]
    }
   ],
   "source": [
    "#np.eye对角线1\n",
    "import numpy as np\n",
    "array_eye = arr_eys = np.eye(4, M=6)\n",
    "print(array_eye)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]\n"
     ]
    }
   ],
   "source": [
    "#np.linspace(start, stop, num=50, endpoint=Ture, retstep=False, dtype=None) 等差数列\n",
    "#start指定开始值；stop指定终值；num指定元素个数；endpoin指定等差数列是否包含终值\n",
    "array_linspace = np.linspace(start=0, stop=5, num=10, endpoint=False)\n",
    "print(array_linspace)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3 2 3 2 3 2 3 1 3 3]\n"
     ]
    }
   ],
   "source": [
    "# randint(low, hight=None, size=None, dtype='l') #指定上下限范围的随机数组\n",
    "array_randint = np.random.randint(1, 4, size=10)\n",
    "print(array_randint)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0 0 0 1 1 1 0 1 1 0]\n"
     ]
    }
   ],
   "source": [
    "# binomial(n, p, size=None) #符合二项分布的随机数组\n",
    "import numpy as np\n",
    "array_binomial = np.random.binomial(1, 0.5, size=10)\n",
    "print(array_binomial)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.19413873  1.90900037 -0.4189809  -0.24653657]\n",
      " [ 1.29352747  2.24669228  1.47362528 -0.9155777 ]\n",
      " [ 0.55202101  0.19771509  0.00538207  0.05690437]]\n"
     ]
    }
   ],
   "source": [
    "# randn(*dn) # 标准正态分布随机数组\n",
    "import numpy as np\n",
    "array_randn = np.random.randn(3, 4)\n",
    "print(array_randn)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.70081185 0.6541085  0.9138817  0.79280585]\n",
      " [0.49253973 0.91231151 0.16339491 0.95376806]\n",
      " [0.93606792 0.18749433 0.10527085 0.08198493]]\n"
     ]
    }
   ],
   "source": [
    "# rand(*dn) 0-1之间均匀分布的随机数组\n",
    "import numpy as np\n",
    "array_rand = np.random.rand(3, 4)\n",
    "print(array_rand)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[[ 7.61085732  9.21518711]\n",
      "  [12.0280415  11.76005327]\n",
      "  [ 9.54692294 11.0091123 ]]]\n"
     ]
    }
   ],
   "source": [
    "# normal(loc=0.0, scale=1.0, size=None)\n",
    "import numpy as np\n",
    "array_normal = np.random.normal(loc=10.0, scale=1.0, size=(1,3,2))\n",
    "print(array_normal)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 1  0  1]\n",
      " [-1  1  1]\n",
      " [ 1 -1 -1]\n",
      " [ 1  1 -1]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "array_4x3_234 = np.array([[1, 0, 1], [-2, 2, 2], [3, -3, -3], [4, 4, -4]])\n",
    "array_sign = np.sign(array_4x3_234)\n",
    "print(array_sign)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[False False False]\n",
      " [False  True False]\n",
      " [False  True False]\n",
      " [False False False]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "array_4x3_235 = np.array([[1, 1, 1], [-2, np.nan, 2], [3, np.nan, 3],[4, 4, -4]])\n",
    "array_isnan = np.isnan(array_4x3_235)\n",
    "print(array_isnan)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0 0 0]\n",
      " [0 5 0]\n",
      " [0 5 0]\n",
      " [0 0 0]]\n"
     ]
    }
   ],
   "source": [
    "# np.where(cond,x,y): 满足条件(cond)输出x， 不满足输出y\n",
    "import numpy as np\n",
    "array_4x3_236 = np.array([[1, 1, 1], [-2, 8, 2], [3, 9, 3],[4, 4, -4]])\n",
    "array_where = np.where(array_4x3_236 > 5, 5, 0)\n",
    "print(array_where)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[1 3 5]\n",
      " [2 4 6]]\n",
      "<class 'numpy.matrix'>\n",
      "[[1 3 5]\n",
      " [2 4 6]]\n",
      "<class 'numpy.ndarray'>\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "matrix_a = np.asmatrix('1 3 5; 2 4 6')\n",
    "\n",
    "print(matrix_a)\n",
    "\n",
    "print(type(matrix_a))\n",
    "\n",
    "array_c = np.array([[1, 3, 5], [2, 4, 6]])\n",
    "print(array_c)\n",
    "print(type(array_c))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[0.54212379 0.51187206 0.62918058 0.86414634]\n",
      " [0.30535131 0.48394844 0.17592409 0.92557597]\n",
      " [0.5785598  0.14048866 0.51379466 0.07164601]\n",
      " [0.34395618 0.4321118  0.50107462 0.40807783]]\n",
      "<class 'numpy.ndarray'>\n",
      "[[0.54212379 0.51187206 0.62918058 0.86414634]\n",
      " [0.30535131 0.48394844 0.17592409 0.92557597]\n",
      " [0.5785598  0.14048866 0.51379466 0.07164601]\n",
      " [0.34395618 0.4321118  0.50107462 0.40807783]]\n"
     ]
    }
   ],
   "source": [
    "#mat函数将目标数据的类型转换成矩阵，然后操作\n",
    "# 构建一个4*4的随机数组\n",
    "array_1 = np.random.rand(4, 4)\n",
    "print(array_1)\n",
    "print(type(array_1))\n",
    "#使用np.mat函数将数组转换为矩阵\n",
    "matrix_1 = np.asmatrix(array_1)\n",
    "print(matrix_1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 7 10]\n",
      " [15 22]]\n"
     ]
    }
   ],
   "source": [
    "A = np.asmatrix('1 2 ; 3 4')\n",
    "B = np.asmatrix('1 2; 3 4')\n",
    "print(np.dot(A, B))\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-2.   1. ]\n",
      " [ 1.5 -0.5]]\n"
     ]
    }
   ],
   "source": [
    "#矩阵的乘法逆矩阵\n",
    "A = np.asmatrix('1 2 ; 3 4')\n",
    "B = np.linalg.inv(A)\n",
    "print(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "计算:A^(-1)B:\n",
      "[[ 5.]\n",
      " [ 3.]\n",
      " [-2.]]\n"
     ]
    }
   ],
   "source": [
    "# 求解线性矩阵方程\n",
    "A = np.asmatrix('1 1 1 ; 0 2 5 ; 2 5 -1')\n",
    "B = np.asmatrix('6 ; -4 ; 27')\n",
    "print('计算:A^(-1)B:')\n",
    "X = np.linalg.solve(A, B)\n",
    "print(X)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
